import logging  # 日志库
import os

import colorlog  # 日志颜色更改库


def setup_logger(logger_name, log_file_path=None, log_format=None):
    """
    设置日志格式和风格

    用法: \r\n
    logger = utilities.setup_logger() \r\n
    logger.debug("This is a DEBUG message") \r\n
    logger.info("This is an INFO message") \r\n
    logger.warning("This is a WARNING message") \r\n
    logger.error("This is an ERROR message") \r\n
    logger.critical("This is a CRITICAL message")


    日志可用的颜色
    文本颜色:
    - \033[30m - 黑色
    - \033[31m - 红色
    - \033[32m - 绿色
    - \033[33m - 黄色
    - \033[34m - 蓝色
    - \033[35m - 紫色
    - \033[36m - 青色
    - \033[37m - 白色
    文本背景色:
    - \033[40m - 黑色背景
    - \033[41m - 红色背景
    - \033[42m - 绿色背景
    - \033[43m - 黄色背景
    - \033[44m - 蓝色背景
    - \033[45m - 紫色背景
    - \033[46m - 青色背景
    - \033[47m - 白色背景
    样式:
    - \033[1m - 高亮/加粗
    - \033[4m - 下划线
    - \033[5m - 闪烁
    - \033[7m - 反白
    - \033[8m - 不可见
    例如:
    \033[31;1;5m红色高亮闪烁文本\033[0m
    \033[33;7m黄底反白文本\033[0m
    """
    # 设置日志格式，包括颜色
    log_colors = {
        'DEBUG': 'cyan',
        'INFO': 'green',
        'WARNING': 'yellow',
        'ERROR': 'red',
        'CRITICAL': 'bold_red'
    }

    # 模仿了java的log4j的方式
    default_log_format = (
        "\033[32m%(asctime)s\033[0m | "  # 绿色时间戳
        "\033[37m%(levelname)s\033[0m | "  # 白色日志级别
        "[\033[36m%(filename)s:%(lineno)d\033[0m] | "  # 青色文件名和行号
        "%(log_color)s%(message)s%(reset)s"  # 消息颜色根据级别变化
    )

    # 如果提供了自定义的日志格式，则使用它，否则使用默认的日志格式
    log_format = log_format or default_log_format

    color_formatter = colorlog.ColoredFormatter(
        log_format,
        datefmt=None,
        reset=True,
        log_colors=log_colors
    )

    # 模仿了java的log4j的方式
    file_log_format = (
        "%(asctime)s | "  # 时间戳
        "%(levelname)s | "  # 日志级别
        "[%(filename)s:%(lineno)d] | "  # 文件名和行号
        "%(message)s"  # 消息
    )
    plain_formatter = logging.Formatter(file_log_format)

    # 创建指定名称的日志记录器
    logger = logging.getLogger(logger_name)
    if not logger.hasHandlers():  # 检查记录器是否已添加处理器，避免重复添加
        # 创建流处理器，用于将日志输出到标准输出（控制台）
        stream_handler = logging.StreamHandler()
        # 为流处理器设置格式化器，使其能够按照指定格式输出日志
        stream_handler.setFormatter(color_formatter)
        # 将流处理器添加到日志记录器中
        logger.addHandler(stream_handler)

        # 判断是否指定了日志文件路径
        if log_file_path:
            # 根据项目根目录下的log子目录构建完整的日志文件路径
            project_log_dir = os.path.join(os.getcwd(), 'logs')
            if not os.path.exists(project_log_dir):
                os.makedirs(project_log_dir)  # 如果log目录不存在，创建之
            full_log_file_path = os.path.join(project_log_dir, log_file_path)

            # 创建文件处理器，用于将日志写入指定文件
            file_handler = logging.FileHandler(full_log_file_path)
            file_handler.setFormatter(plain_formatter)  # 使用无颜色的格式化器

            # 将文件处理器添加到日志记录器中
            logger.addHandler(file_handler)

        # 设置日志记录器的最低日志级别为DEBUG，表示将记录所有DEBUG级别及以上的日志信息
        logger.setLevel(logging.DEBUG)
    return logger
